# -*- coding: UTF-8 -*-
from django.models.auth import sessions, users
from django.core import formfields, validators

class AuthenticationForm(formfields.Manipulator):
    """
    La classe de base pour l'authentification des utilisateurs. Étendez cette classe
    pour obtenir un formulaire permettant de se connecter en fournissant un nom
    d'utilisateur et un mot de passe.
    """
    def __init__(self, request=None):
        """
        Si l'argument request est fourni, le manipulateur vérifiera si les cookies
        sont activés. Notez que l'argument request (un objet HttpRequest représentant
        une requête) doit avoir défini un cookie de nom TEST_COOKIE_NAME et de valeur
        TEST_COOKIE_VALUE pour que la validation fonctionne.
        """
        self.request = request
        self.fields = [
            formfields.TextField(field_name="username", length=15, maxlength=30, is_required=True,
                validator_list=[self.isValidUser, self.hasCookiesEnabled]),
            formfields.PasswordField(field_name="password", length=15, maxlength=30, is_required=True,
                validator_list=[self.isValidPasswordForUser]),
        ]
        self.user_cache = None

    def hasCookiesEnabled(self, field_data, all_data):
        if self.request and (not self.request.COOKIES.has_key(sessions.TEST_COOKIE_NAME) or self.request.COOKIES[sessions.TEST_COOKIE_NAME] != sessions.TEST_COOKIE_VALUE):
            raise validators.ValidationError, "Il semble que votre navigateur web ait désactivé les cookies. Les cookies sont nécessaires pour pouvoir se connecter."

    def isValidUser(self, field_data, all_data):
        try:
            self.user_cache = users.get_object(username__exact=field_data)
        except users.UserDoesNotExist:
            raise validators.ValidationError, "Veuillez entrer un nom d'utilisateur et un mot de passe correct. Notez que les deux champs sont sensibles à la casse."

    def isValidPasswordForUser(self, field_data, all_data):
        if self.user_cache is not None and not self.user_cache.check_password(field_data):
            self.user_cache = None
            raise validators.ValidationError, "Veuillez entrer un nom d'utilisateur et un mot de passe correct. Notez que les deux champs sont sensibles à la casse."

    def get_user_id(self):
        if self.user_cache:
            return self.user_cache.id
        return None

    def get_user(self):
        return self.user_cache
